//--- Projeto Domus
// interactionsource.com
// Koji Pereira, Andre Veloso e Marcos Paulo

/*
 Projeto Domus
 interactionsource.com
 Koji Pereira, Andre Veloso e Marcos Paulo

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

              // Bola do teto
              
              // MMA7260QT 3-Axis Accelerometer
              // Sampling rate - 350Hz eixos X e Y - 1 sample a cada 2.857ms
              // 150Hz eixo Z - 1 sample a cada 6.66ms
              
              // Nessa versao ao se bater na bola, as cores mudarao, MAS COM UMA COR A CADA BATIDA voltando ao
              //vermelho piscante ao estabilizar o movimento.
              
              
              #define pinX 0   // Numero do pino onde se vai ligar o X do acelerometro
              #define pinY 1   // Numero do pino onde se vai ligar o Y do acelerometro
              #define pinZ 2   // Numero do pino onde se vai ligar o Z do acelerometro
              
              int valX = 0; 
              int valY = 0; 
              int valZ = 0;
              
              float tensaoX;
              float tensaoY;
              float tensaoZ;
              
              float forcaX;
              float forcaY;
              float forcaZ;
              
              float oldValX = 0; 
              float oldValY = 0; 
              float oldValZ = 0;
              
              float diffX = 0;
              float diffY = 0;
              float diffZ = 0;
              
              int LedR = 3;
              int LedG = 5;
              int LedB = 6;
              
              
             /*
             * Pulsating LEDs with Pulse Width Modulation
             */
            
            int time    = 2;             // define delay element
            int pulsewidth;              // define pulsewidth (0-255)
            int estadoBola = 0;             //guarda o estado da bola
            int qtEstadoBola = 10;          //treshold do estado da bola representa a quantidade de " estado parado" necessário para a confirmação do estado parado
              
              
              
              unsigned char redVal;
              unsigned char greenVal;
              unsigned char blueVal;
              
              int lastRedVal;
              int lastGreenVal;
              int lastBlueVal;
    
              
              float h = 0;
              float s = 1.0;
              float v = 0.8;
              
              float qtMovimentacao = 0;
              //guarda valor de movimentacao para comparar com movimento seguinte
              float qtMovimentacaoOld  = qtMovimentacao;
              
              float resultante;
              
              float oldResultante;
              
              float diffResultante;
              
              int pulso = 0;
              char sig_pulso = 0;
              
              int cont_caindo = 0;
              int cont_subindo = 0;
              int cont_lento = 0;
              int cont_transicao = 0;
              
              float smoothedResultante   = 0;    // smoothed result
              float samples              = 4;    // amount of samples
              
              void setup(){
              	Serial.begin(57600);  // Output do serial com Baud Rate de 57600
                       
                      //Seta o valor de referencia do Arduino de acordo com o 
                      //valor vindo do acelerometro na sua saida VCC +- 3.3V 
                      analogReference(EXTERNAL);
              
              	redVal = 0; 
              	greenVal = 0; 
              	blueVal = 0;
              
              	lastRedVal = 0;
              	lastGreenVal = 0;
              	lastBlueVal = 0;
              
              	update();
                 
                // define o estado inicial da bola como parado para a verficação do loop de mudança de cores
                estadoBola = qtEstadoBola;
              }
              
              // This function updates the LED outputs.
              void update() {
              	analogWrite(LedR, redVal);
              	analogWrite(LedG, greenVal);
              	analogWrite(LedB, blueVal);
              
              }
              
            
              
              void sorteiacor() {
                analogWrite(LedR, 0);
                 redVal = random(100);
                 greenVal = random(255);
                 blueVal = random(255);
                 update();

                   // if (((lastRedVal == redVal) && (lastGreenVal == greenVal) && (lastBlueVal == blueVal)) || ((redVal == 0) && (greenVal == 0) && (blueVal == 0)) ){
                   //       color_cicle();
                    //} else {
                         // updateRGB(redVal, greenVal, blueVal);
                         // Serial.print ("updateRGB");
                    
                   // };
              
              }
           
              
              void loop(){
              
              	oldValX = forcaX;
              	oldValY = forcaY;
              	oldValZ = forcaZ;
              
              	oldResultante = resultante;
              
              	//Leitura Bruta dos valores de aceleracao do sensor
              	valX = analogRead(pinX);    // Ler o pino X
              	valY = analogRead(pinY);    // Ler o pino Y
              	valZ = analogRead(pinZ);    // Ler o pino Z
               
  Serial.print(" - Valor X:");
  Serial.print(valX);
  Serial.print(" valor Y:");  
  Serial.print(valY);
  Serial.print(" valor Z:");
  Serial.print(valZ);
                           
              
              
                      //Transforma a leitura de entrada de 0 a 1023 na leitura de 
                      //tensao dereferencia 3.3 vindo do acelerometro
                      tensaoX = (valX) * (3.2) / (1023);
                      tensaoY = (valY) * (3.2) / (1023);
                      tensaoZ = (valZ) * (3.2) / (1023);
              
              	//calcula os valores de forca aplicados aos eixos
              	forcaX = tensaoX-1.65;
              	forcaY = tensaoY-1.65;
              	forcaZ = tensaoZ-1.65;
              
  //Serial.print(" - forcaX:");
  //Serial.print(forcaX);
 // Serial.print(" forcaY:");  
 // Serial.print(forcaY);
 // Serial.print(" forcaZ:");
  //Serial.print(forcaZ);
              
              	//Calcula a diferenca de aceleracao dos eiXos
              	diffX = forcaX-oldValX;
              	diffY = forcaY-oldValY;
              	diffZ = forcaZ-oldValZ;
              
              	if (diffX<0) diffX *= (-1);
              	if (diffY<0) diffY *= (-1);
              	if (diffZ<0) diffZ *= (-1);
              
                      resultante = sqrt( sq(forcaX) + sq(forcaY) + sq(forcaZ) );
                      
              Serial.print(resultante);
              
              	qtMovimentacao = diffX + diffY + diffZ;
              
                      //Suavisa a amostra da resultante
                      smoothedResultante = smoothedResultante + ((resultante - smoothedResultante)/samples);
                      
                      diffResultante = smoothedResultante - 0.84;
              
            //  Serial.print(" - diffResultante: ");
            //  Serial.print(diffResultante);
              
              
             	//Serial.print(" - qtMovimentacao: ");
             	//Serial.print(qtMovimentacao);
             
                     if ((qtMovimentacao <= 0.04) && (diffResultante>=(-0.03)) && (diffResultante <= 0.00)){
                       
                            if(estadoBola >= qtEstadoBola){
                                       // slowly fade the LEDs to full brightness
                                      for (pulsewidth=0; pulsewidth <= 255; pulsewidth++){
                                          analogWrite(LedR, pulsewidth);
                                          analogWrite(LedG, 0);
                                          analogWrite(LedB, 0);
                                          delay(time);
                                      }
                                      // slowly dim the LEDs
                                     for (pulsewidth=255; pulsewidth >= 0; pulsewidth--){
                                          analogWrite(LedR, pulsewidth);
                                          analogWrite(LedG, 0);
                                          analogWrite(LedB, 0);
                                           delay(time);
                                      }
                               
                              Serial.print(" - ### lento ou parado ");
                              //qtEstadoBola = 10;
                            }
                            
                           estadoBola++;
                            Serial.print(estadoBola);
                
                	} else { 
                            //Mantem o estado da bola
                            //Modifica a variavel de retorno de acordo com o valor da movimentação.
                           // qtEstadoBola = qtMovimentacao *100;
                              if (estadoBola > qtEstadoBola){
                		sorteiacor();
                                estadoBola = 0;
                               // qtEstadoBola = qtMovimentacao *10000;
                              }
                              Serial.print(" - ### movimentando ");
                              estadoBola = 0;
                            // delay(10000);                  // waits for a second
                             // pulsewidth = 0;
                
                	} 
    
              	Serial.println(" ");
              }

